package com.exm.collectcodenew.juc.aqs;

import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.Semaphore;

public class SemaphoreTest<T> {
    public final Set<T> set;
    private final Semaphore sema;
    public SemaphoreTest(int bound){
        this.set = Collections.synchronizedSet(new HashSet<T>());
        this.sema = new Semaphore(bound);
    }
    public boolean add(T o) throws InterruptedException{
        sema.acquire();
        boolean wasAdded = false;
        try{
            wasAdded = set.add(o);
            return wasAdded;
        }finally{
            if(!wasAdded){
                sema.release();
            }
        }
    }
    public boolean remove(T o){
        boolean wasRemoved = set.remove(o);
        if(wasRemoved){
            sema.release();
        }
        return wasRemoved;
    }
    public static void main(String[] args) throws InterruptedException{
        int permits = 5;
        //先初始化信号量量sema的许可个数为5
        SemaphoreTest<Integer> test = new SemaphoreTest<Integer>(permits);
        for(int i = 0; i < 10; i++){
            //通过add()添加数据，每添加一个数据，就消耗sema的一个许可；
            test.add(i);
            //当5个许可全部消耗完毕后，如果需要再添加数据，因为sema的许可为0，阻塞请求。
            //备注：如果这个时候调用了sema.release()，会释放一个许可，那么add()会继续添加一个元素，之后的请求继续阻塞，直到有新的许可释放。
            System.out.println("set:" + test.set);
        }
    }
}
